package com.chaopei.day07;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @Author Corday 天涯
 * @Date 2022/3/11 15:16
 * 模拟用户的注册与登录，使用i/o与文件存取
 */
public class RegisterAndLogin {//完成登录注册功能

    //显示菜单
    public void dispMenu() {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("***用户登录***");
            System.out.println("*1.------登录*");
            System.out.println("*2.------注册*");
            System.out.println("*3.------退出*");
            System.out.println("**************");
            System.out.print("请选择(1-3):");
            int select = sc.nextInt();
            switch (select) {
                case 1://登录
                    System.out.print("请输入用户名:");
                    String uname = sc.next();
                    System.out.print("请输入密码:");
                    String pass = sc.next();
                    Us us = new Us(uname, pass);
                    System.out.println(login(us));
                    break;
                case 2://注册
                    System.out.print("请输入注册用户:");
                    String un = sc.next();
                    System.out.print("请输入注册密码:");
                    String pa = sc.next();
                    Us u = new Us(un, pa);
                    System.out.println(regUser(u));
                    break;
            }
            if (select == 3) {
                sc.close();//关闭键盘扫描对象
                System.out.println("欢迎再来!");
                break;//退出
            }
        }
    }

    //实现注册功能,只需注册到一个List集合对象即可
    public String regUser(Us us) {
        File file = new File("c:/temp/users.txt");
        ////需要先从读取集合对象
        InputStream in = null;
        ObjectInputStream ois = null;
        ////注册新用户,写入新的对象
        OutputStream os = null;
        ObjectOutputStream oos = null;
        boolean flag=findUs(us.getUname());
        //System.out.println("注册flag:"+flag);
        //如果文件存在并且,用户名不存在可以注册
        if (file.exists()&&flag) {
            // 创建对象
            try {
                //需要先读取之前的list集合
                in = new FileInputStream(file);
                ois = new ObjectInputStream(in);
                List<Us> list = (List<Us>) ois.readObject();
                //此处要用覆盖,存取一个list集合保存多个用户即可
                os = new FileOutputStream(file);
                oos = new ObjectOutputStream(os);
                //将新用户存入取出来的集合对象中
                list.add(us);
                //再将拿出的集合对象重新写入文件中
                oos.writeObject(list);
                //关闭各个流
                oos.close();
                os.close();
                in.close();
                return "用户注册成功!";
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }//以下不能用else
        } else if(!file.exists()) {//如果文件不存在,则是最新的用户可以直接注册
            // 创建对象,注意跟上边的区分一下
            try {
                //此处要用覆盖,存取一个list集合保存多个用户即可
                os = new FileOutputStream(file);
                oos = new ObjectOutputStream(os);
                //将新用户存入取创建的集合对象中
                List<Us> list = new ArrayList<>();
                list.add(us);
                //再将拿出的集合对象重新写入文件中
                oos.writeObject(list);
                //关闭各个流
                oos.close();
                os.close();
                return "亲,注册成功!";
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "用户名已存在!";
    }

    //实现登录功能

    /**
     * @param us
     * @return
     */
    public String login(Us us) {
        String info = "用户不存在,请注册!";
        File file = new File("c:/temp/users.txt");
        InputStream in = null;
        BufferedInputStream bis = null;
        ObjectInputStream ois = null;
//        创建对象
        if (file.exists()) {
            try {
                in = new FileInputStream(file);
                bis = new BufferedInputStream(in, 1024);
                ois = new ObjectInputStream(bis);
                //判断用户名与密码是否正确
                boolean flag = false;
                List<Us> list = (List<Us>) (ois.readObject());
                for (Us temp : list) {
                    flag = temp.getUname().equals(us.getUname()) && temp.getPass().equals(us.getPass());
                    //如果为真表示用户名与密码正确,并提前退出
                    if (flag) {
                        break;
                    }
                }//for
                if (flag) {
                    info = "亲,登录成功!";
                } else {
                    info = "用户名或密码有误!";
                }
                ois.close();
                bis.close();
                in.close();//关闭流
            } catch (Exception e) {
                e.printStackTrace();
            }
        }// if

        return info;
    }

    //注册前,查询用户名是否存在
    public boolean findUs(String uname) {
        InputStream in = null;
        BufferedInputStream bis = null;
        ObjectInputStream ois = null;
        File file = new File("c:/temp/users.txt");
        boolean flag = false;
        if (file.exists()) {
            try {
                in = new FileInputStream(file);
                bis = new BufferedInputStream(in);
                ois = new ObjectInputStream(bis);
                //获取用户对象的集合
                List<Us> list = (List<Us>) ois.readObject();
                for (Us temp : list) {
                    flag = temp.getUname().equals(uname);
                    if (flag) {//如果用户存在提前中止循环
                        //System.out.println("用户已存在");
                        break;
                    }
                }
                //关闭流
                ois.close();
                bis.close();
                in.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //运回true,表示用户不存在,可以注册,否则不可以注册
        return flag == false;
    }
}

////测试一下
class TestRegAndLogin {
    public static void main(String[] args) {
        //显示菜单
        new RegisterAndLogin().dispMenu();
    }
}
